﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Data.Entity.Infrastructure;
using System.Data.Objects;

namespace DataAccess.DAL
{
    public class BaseDAL
    {

        /// <summary>
        /// Contexto de entidades del dominio
        /// </summary>
        public LuzYFuerzaEntities Contexto
        {
            get
            {

                HttpContext httpContext = HttpContext.Current;

                if (httpContext.Items["LuzYFuerzaContexto"] == null)
                {
                    var contexto = new LuzYFuerzaEntities();
                    //contexto.Configuration.ValidateOnSaveEnabled = false;
                    httpContext.Items["LuzYFuerzaContexto"] = contexto;
                }
                return (LuzYFuerzaEntities)httpContext.Items["LuzYFuerzaContexto"];
            }
            private set
            {
                HttpContext httpContext = HttpContext.Current;

                httpContext.Items["LuzYFuerzaContexto"] = value;
            }
        }

        public BaseDAL()
        {
            if (Contexto == null)
            {
                Contexto = new LuzYFuerzaEntities();
            }

        }

        public void GuardarCambios()
        {
            Contexto.SaveChanges();
        }

        /// <summary>
        /// Guarda cambios en el context actual sin hacer commit a la base de datos
        /// </summary>
        public void GuardarCambiosConTransaccion()
        {

            //Antes
            //Contexto.SaveChanges(SaveOptions.DetectChangesBeforeSave);

            //Desde EF 4.1
            ((IObjectContextAdapter)Contexto).ObjectContext.SaveChanges(SaveOptions.DetectChangesBeforeSave);

        }

        /// <summary>
        /// Realiza un commit de las operacion realizadas a la base de datos
        /// </summary>
        public void AceptarTodosLosCambios()
        {
            ((IObjectContextAdapter)Contexto).ObjectContext.AcceptAllChanges();
        }

        public ObjectContextOptions Opciones()
        {
            return ((IObjectContextAdapter)Contexto).ObjectContext.ContextOptions;
        }

        private bool ExisteContexto
        {
            get
            {
                HttpContext httpContext = HttpContext.Current;

                return (httpContext.Items["LuzYFuerzaContexto"] != null);
            }
        }

        private bool disposed = false;

        protected virtual void Dispose(bool disposing)
        {
            if (!this.disposed)
            {
                if (disposing)
                {
                    if (ExisteContexto)
                    {
                        Contexto.Dispose();
                    }
                }
            }
            this.disposed = true;
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

    }
}
